/**
 *  操作文件夹
 *  如何创建文件夹？
 *  如何删除文件夹？
 *  如何判断是不是文件夹？
 *  文件夹里面有什么内容
 *  也有同步和异步
 */
const fs = require('fs');
const path = require('path');

// 创建文件夹，当前目录的父目录必须存在
/* fs.mkdir('a/b', (err, data) => {
  console.log(data);
}); */

// 删除目录，必须保证目录中的内容是空的
// fs.rmdir('a', (err, data) => {});

// 读取的结果只有儿子一层
// fs.readdir('a', (err, data) => {
//   console.log(data);
//   data.map((item) => {
//     let p = path.join('a', item);
//     fs.stat(p, (err, stat) => {
//       // 判断是否文件夹
//       console.log(stat.isDirectory(), stat.isFile());
//       if (stat.isFile()) {
//         fs.unlink(p, () => {});
//       }
//     });
//     return p;
//   });
// });

// 异步删除文件夹，串行，并行

/* function rmdir(dir, cb) {
  fs.stat(dir, (err, stat) => {
    // 是文件直接删除
    if (stat.isFile) {
      fs.unlink(dir, cb);
    } else {
      // 读取文件夹中的内容
      fs.readdir(dir, (err, dirs) => {
        dirs = dirs.map((item) => path.join(dir, item));
        // console.log(dirs);
        // 先删除儿子，再删除自己
        let index = 0;
        function next() {
          if (index === dirs.length) return fs.rmdir(dir, cb);
          let current = dirs[index++];
          rmdir(current, next);
        }
        next();
      });
    }
  });
} */

function rmdir(dir, cb) {
  fs.stat(dir, (err, stat) => {
    // 是文件直接删除
    if (stat.isFile) {
      fs.unlink(dir, cb);
    } else {
      // 读取文件夹中的内容
      fs.readdir(dir, (err, dirs) => {
        dirs = dirs.map((item) => path.join(dir, item));
        // console.log(dirs);
        // 先删除儿子，再删除自己

        // 并发删除多个儿子，而删除完毕再通知父亲
        if (dirs.length === 0) {
          return fs.rmdir(dir, cb);
        }
        let idx = 0;
        function done() {
          if (++idx === dirs.length) {
            fs.rmdir(dir, cb);
          }
        }

        for (let i = 0; i < dirs.length; i++) {
          let dir = dirs[i];
          rmdir(dir, done);
        }
      });
    }
  });
}

// 层序遍历删除文件夹，作业
rmdir('a', function () {
  console.log('删除成功了');
});
